package com.xing.common.helper;

import com.xing.common.utils.MD5;
import lombok.extern.slf4j.Slf4j;


import java.util.*;

/**
 * @Author: xingfuhao
 * @Date: 2022/05/27/10:34
 */

@Slf4j
public class HttpRequestHelper {

    public static void main(String[] args) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("d", "4");
        paramMap.put("b", "2");
        paramMap.put("c", "3");
        paramMap.put("a", "1");

       // log.info(getSign(paramMap, ""));
    }

    /**
     * 转变map
     *
     * @param paramMap
     * @return
     */
    public static Map<String, Object> switchMap(Map<String, String[]> paramMap) {
        Map<String, Object> resultMap = new HashMap<>();
        //遍历map里面的set的值，
        //返回map键值对所组成的Set集合，集合元素是Map.Entry(Map的内部类)对象
        //value是个数组，我只有取第一个value的值,也只有一个value
        for (Map.Entry<String, String[]> param : paramMap.entrySet()) {
            resultMap.put(param.getKey(), param.getValue()[0]);
        }
        return resultMap;


    }

//    /**
//     * 请求数据获取签名
//     *
//     * @param paramMap
//     * @param signKey  签名秘钥
//     * @return
//     */
//    public static String getSign(Map<String, Object> paramMap, String signKey) {
//        //containsKey: 包含秘钥
//        if (paramMap.containsKey("sign")) {
//            paramMap.remove("sign");
//        }
//
//        TreeMap<String, Object> sorted = new TreeMap<>(paramMap);
//        StringBuilder str = new StringBuilder();
//        for (Map.Entry<String, Object> param : sorted.entrySet()) {
//            str.append(param.getValue()).append("|");
//        }
//        str.append(signKey);
//        log.info("加密前：" + str.toString());
//        String md5Str = MD5.encrypt(str.toString());
//        log.info("加密后：" + md5Str);
//        return md5Str;
//
//    }

    /**
     * Map 常用的方法
     */
    public void testMap() {
        //创建map
        Map map = new HashMap<>();

        //1.添加
        map.put("1", "小说");

        //2.删除
        //删除指定key的键值对，返回被删除的key关联的value，不存在返回null
        map.remove("1");
        //删除指定的键值对，成功返回true
        map.remove("1", "小说");
        //删除map中的所有键值对
        map.clear();

        //3.计数
        //返回map中键值对的个数
        map.size();

        //4.判断
        //判断是否为空
        map.isEmpty();
        //判断map中是否包含指定的key
        map.containsKey("1");
        //判断map中是否包含指定的value
        map.containsValue("小说");

        //5.取值
        //返回指定key对应的value，不存在则返回null
        map.get("1");
        //返回map键值对所组成的Set集合，集合元素是Map.Entry(Map的内部类)对象
        Collection set = map.entrySet();
        //返回map中key的Set集合
        Collection set1 = map.keySet();
        //返回的是map里所有value组成的集合
        Collection set2 = map.values();

        //遍历Map的方式
    }


    /**
     * 签名校验
     *
     * @param paramMap
     * @param signkey
     * @return
     */
    public static boolean isSignEquals(Map<String, Object> paramMap, String signkey) {
        String sign = (String) paramMap.get("sign");
        String md5Str = getSign(paramMap, signkey);
        if(!sign.equals(md5Str)){
            return false;
        }
        return true;
    }


    /**
     * 请求数据获取签名
     *
     * @param paramMap
     * @param signKey
     * @return
     */
    public static String getSign(Map<String, Object> paramMap, String signKey) {
        if(paramMap.containsKey("sign")){
            paramMap.remove("sign");
        }
        TreeMap<String, Object> sorted = new TreeMap<>(paramMap);
        StringBuilder str = new StringBuilder();
        for (Map.Entry<String, Object> param : sorted.entrySet()) {
            str.append(param.getValue()).append("|");
        }
        str.append(signKey);
        log.info("加密前："+str.toString());
        String md5Str = MD5.encrypt(str.toString());
        log.info("加密后："+md5Str);
        return md5Str;
    }


}
